package com.smart.community.commons.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 基础Mapper接口
 * @author Wu.Liang
 * @since 2024-12-19
 * @version 1.0.0
 * @param <T> 实体类型
 */
public interface IBaseMapper<T> extends BaseMapper<T> {
    
    /**
     * 批量插入
     * 
     * @param entityList 实体列表
     * @return 插入数量
     */
    int insertBatch(@Param("list") List<T> entityList);
    
    /**
     * 批量更新
     * 
     * @param entityList 实体列表
     * @return 更新数量
     */
    int updateBatch(@Param("list") List<T> entityList);
    
    /**
     * 批量删除
     * 
     * @param idList ID列表
     * @return 删除数量
     */
    int deleteBatch(@Param("list") List<Long> idList);
    
    /**
     * 根据ID列表查询
     * 
     * @param idList ID列表
     * @return 实体列表
     */
    List<T> selectBatchIds(@Param("list") List<Long> idList);
    
    /**
     * 根据条件查询数量
     * 
     * @param entity 查询条件
     * @return 数量
     */
    int selectCountByCondition(@Param("entity") T entity);
    
    /**
     * 根据条件查询列表
     * 
     * @param entity 查询条件
     * @return 实体列表
     */
    List<T> selectListByCondition(@Param("entity") T entity);
    
    /**
     * 根据条件查询单个实体
     * 
     * @param entity 查询条件
     * @return 实体
     */
    T selectOneByCondition(@Param("entity") T entity);
    
    /**
     * 逻辑删除
     * 
     * @param id ID
     * @return 删除数量
     */
    int logicDeleteById(@Param("id") Long id);
    
    /**
     * 批量逻辑删除
     * 
     * @param idList ID列表
     * @return 删除数量
     */
    int logicDeleteBatchIds(@Param("list") List<Long> idList);
    
    /**
     * 恢复删除
     * 
     * @param id ID
     * @return 恢复数量
     */
    int restoreById(@Param("id") Long id);
    
    /**
     * 批量恢复删除
     * 
     * @param idList ID列表
     * @return 恢复数量
     */
    int restoreBatchIds(@Param("list") List<Long> idList);
    
    /**
     * 根据条件逻辑删除
     * 
     * @param entity 删除条件
     * @return 删除数量
     */
    int logicDeleteByCondition(@Param("entity") T entity);
    
    /**
     * 根据条件恢复删除
     * 
     * @param entity 恢复条件
     * @return 恢复数量
     */
    int restoreByCondition(@Param("entity") T entity);
    
    /**
     * 查询所有（包括已删除）
     * 
     * @return 实体列表
     */
    List<T> selectAllWithDeleted();
    
    /**
     * 根据条件查询（包括已删除）
     * 
     * @param entity 查询条件
     * @return 实体列表
     */
    List<T> selectListByConditionWithDeleted(@Param("entity") T entity);
    
    /**
     * 根据ID查询（包括已删除）
     * 
     * @param id ID
     * @return 实体
     */
    T selectByIdWithDeleted(@Param("id") Long id);
    
    /**
     * 根据ID列表查询（包括已删除）
     * 
     * @param idList ID列表
     * @return 实体列表
     */
    List<T> selectBatchIdsWithDeleted(@Param("list") List<Long> idList);
    
    /**
     * 物理删除
     * 
     * @param id ID
     * @return 删除数量
     */
    int physicalDeleteById(@Param("id") Long id);
    
    /**
     * 批量物理删除
     * 
     * @param idList ID列表
     * @return 删除数量
     */
    int physicalDeleteBatchIds(@Param("list") List<Long> idList);
    
    /**
     * 根据条件物理删除
     * 
     * @param entity 删除条件
     * @return 删除数量
     */
    int physicalDeleteByCondition(@Param("entity") T entity);
    
    /**
     * 清空表（物理删除）
     * 
     * @return 删除数量
     */
    int truncateTable();
    
    /**
     * 获取表名
     * 
     * @return 表名
     */
    String getTableName();
    
    /**
     * 获取主键字段名
     * 
     * @return 主键字段名
     */
    String getPrimaryKeyField();
    
    /**
     * 获取删除标记字段名
     * 
     * @return 删除标记字段名
     */
    String getDeletedField();
    
    /**
     * 获取创建时间字段名
     * 
     * @return 创建时间字段名
     */
    String getCreateTimeField();
    
    /**
     * 获取更新时间字段名
     * 
     * @return 更新时间字段名
     */
    String getUpdateTimeField();
    
    /**
     * 获取创建人字段名
     * 
     * @return 创建人字段名
     */
    String getCreateByField();
    
    /**
     * 获取更新人字段名
     * 
     * @return 更新人字段名
     */
    String getUpdateByField();
} 